package com.gxuwz.attend.tools;

import org.apache.commons.codec.binary.Base64;

import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

/**
 *
 * 基于MD5加密算法的工具类，封装加密、解密的方法。
 * 注意：java.security.MessageDigest类为应用程序提供消息摘要算法的功能，例如:MD5、SHA-1或SHA-256。
 * 消息摘要是安全的单向散列函数，它采用任意大小的数据并输出固定长度的散列值，如
 * MD5加密后得到的密文长度为32位
 * SHA加密后得到的密文长度为40位
 * Base64加密可以指定字符集，可以解密。
 * 使用过程：
 *      MessageDigest对象开始初始化。 使用update方法通过它处理数据。 在任何时候都可以调用reset来重置摘要。
 *      一旦更新了所有要更新的数据，就应该调用其中一个digest方法来完成哈希计算。
 */
public class MD5Util {
    private static final String algorithmName_md5="md5";
    /**
     * 加密
     * @param inputText
     * @return
     */
    public static String encryptMd5(String inputText){
        return encrypt(inputText,algorithmName_md5);
    }

    /**
     * Base64解密
     * @param inputText
     * @return
     */
  public static String base64Decode(String inputText){
      if (inputText ==null)
          throw new IllegalArgumentException("The method parameter cannot be empty");
      String encodeBase64 =new String(Base64.decodeBase64(inputText.getBytes()));
      return encodeBase64;
  }
    /**
     * Base64加密
     * @param inputText
     * @return
     */
   public static   String  base64Encode(String inputText){
       if (inputText ==null)
           throw new IllegalArgumentException("The method parameter cannot be empty");
       String decodeBase64 =Base64.encodeBase64String(inputText.getBytes());
       return  decodeBase64;
    }

    /**
     * 加密算法
     * @param inputText 明文内容
     * @param algorithmName MessageDigest类提供的加密算法名称
     * @return
     */
    private static String encrypt(String inputText, String algorithmName) {
        if (inputText == null || "".equals(inputText.trim())) {
            throw new IllegalArgumentException("The method parameter name cannot be empty");
        }
        if (algorithmName == null || "".equals(algorithmName.trim())) {
            algorithmName =algorithmName_md5;
        }
        String encryptText = null;
        try {
            MessageDigest m = MessageDigest.getInstance(algorithmName);
            //传入数据
            m.update(inputText.getBytes("UTF8"));
            byte s[] = m.digest();
            encryptText= toHex(s);
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
            throw e;
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
            throw e;
        }finally {
            return encryptText;
        }
    }


    /**
     * 转换为十六进制
     * @param arr
     * @return
     */
    private static String toHex(byte[] arr) {
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < arr.length; ++i) {
            //执行按位&（与）运算和|（或）运算
            sb.append(Integer.toHexString((arr[i] & 0xFF) | 0x100).substring(1, 3));
        }
        return sb.toString();
    }
}
